/* Modul ukazuje moznou praci s hiearchii procesu.
 * Tzn. vyuziva toho, ze korenem je proces init a ostatni procesy jsou jeho potomci
 */
#include <linux/module.h>   // Potrebne pro praci s moduly
#include <linux/kernel.h>

#include <linux/sched.h>    // Pro ukazkovou praci s moduly, makra, typy, ...

int init_module(void)
{
    struct task_struct *task;
    struct list_head *list;
    
    // Ukazka pruchodu vsemi procesy pomoci makra for_each_process()
    printk("Vypis vsech procesu zacina \n");
    for_each_process(task) {
        printk("%s[%d]\n", task->comm, task->pid);
    }

    // Ukazka vypisu vsech potomku aktualniho procesu
    printk("Nyni vypiseme vsechny potomky aktualniho procesu \n");
    list_for_each(list, &current->children) {
        task = list_entry(list, struct task_struct, sibling);
        printk("%s[%d]\n", task->comm, task->pid);

    }
    return 0;
}

void cleanup_module(void)
{
    // Ukazka ziskani aktualniho processu pomoci makra current a 
    // current_thread_info()
    printk("Hrani s aktualnim procesem \n");
    printk("Akt. proces (current): %s[%d]\n", current->comm, current->pid);
    printk("Akt. proces (cti): %s[%d]\n", current_thread_info()->task->comm,
            current_thread_info()->task->pid);
    
    // Dukaz toho ze predek vsech procesu je init (swapper)
    struct task_struct *task;
    for(task = current; task != &init_task; task = task->parent) ;
    printk("Proces init: %s[%d]\n", task->comm, task->pid);

    printk("Prace s procesi konci \n");
}
